package com.estagio.bean;

import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.primefaces.context.RequestContext;

import com.estagio.entity.CondicaoPagamento;
import com.estagio.entity.FormaPagamento;
import com.estagio.entity.Parcela;
import com.estagio.session.CondicaoPagamentoSession;
import com.estagio.session.FormaPagamentoSession;
import com.estagio.session.ParcelaSession;

@ManagedBean(name="condicaoPagamentoBean")
@SessionScoped
public class CondicaoPagamentoBean {
	
	//CONDICAO DE PAGAMENTO
	private CondicaoPagamento condicaoPagamento = new CondicaoPagamento();
	private String mensagem;
	private DataModel dmCondicaoPagamento;
	private CondicaoPagamento condicaoPagamentoSave;
	
	//FORMA DE PAGAMENTO
	private FormaPagamento formaPagamento = new FormaPagamento();
	private DataModel dmFormaPagamento;
	
	//PARCELA
	private Parcela parcela = new Parcela();
	private List<Parcela> listaParcela;
	private Parcela parcelaSelect = new Parcela();
	private Double totalParcela;
	
	
	
	//GETTERS AND SETTERS
	
	
	public CondicaoPagamento getCondicaoPagamentoSave() {
		return condicaoPagamentoSave;
	}

	public Double getTotalParcela() {
		return totalParcela;
	}

	public void setTotalParcela(Double totalParcela) {
		this.totalParcela = totalParcela;
	}

	public void setCondicaoPagamentoSave(CondicaoPagamento condicaoPagamentoSave) {
		this.condicaoPagamentoSave = condicaoPagamentoSave;
	}


	public DataModel getDmCondicaoPagamento() {
		return dmCondicaoPagamento;
	}

	public void setDmCondicaoPagamento(DataModel dmCondicaoPagamento) {
		this.dmCondicaoPagamento = dmCondicaoPagamento;
	}

	public CondicaoPagamento getCondicaoPagamento() {
		return condicaoPagamento;
	}

	public void setCondicaoPagamento(CondicaoPagamento condicaoPagamento) {
		this.condicaoPagamento = condicaoPagamento;
	}
	
	public FormaPagamento getFormaPagamento() {
		return formaPagamento;
	}

	public void setFormaPagamento(FormaPagamento formaPagamento) {
		this.formaPagamento = formaPagamento;
	}

	public DataModel getDmFormaPagamento() {
		return dmFormaPagamento;
	}

	public void setDmFormaPagamento(DataModel dmFormaPagamento) {
		this.dmFormaPagamento = dmFormaPagamento;
	}
	
	public Parcela getParcela() {
		return parcela;
	}

	public void setParcela(Parcela parcela) {
		this.parcela = parcela;
	}

	public List<Parcela> getListaParcela() {
		return listaParcela;
	}

	public void setListaParcela(List<Parcela> listaParcela) {
		this.listaParcela = listaParcela;
	}

	public Parcela getParcelaSelect() {
		return parcelaSelect;
	}

	public void setParcelaSelect(Parcela parcelaSelect) {
		this.parcelaSelect = parcelaSelect;
	}

	//CONDICAO PAGAMENTO
	public void saveCondicaoPagamento() {
		RequestContext.getCurrentInstance().update(":formDialog:pgDialogManterCondicaoPagamento");
		CondicaoPagamentoSession session = new CondicaoPagamentoSession();
		this.mensagem = session.save(this.condicaoPagamentoSave, this.listaParcela);
		
		if(!(this.mensagem.equals("CondicaoPagamento salvo com sucesso!"))) {
			FacesMessage faces = new FacesMessage(FacesMessage.SEVERITY_ERROR, this.mensagem, "");
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, faces);
			RequestContext.getCurrentInstance().update("'messages");
		} else {
			RequestContext.getCurrentInstance().update("dataTableCondicaoPagamento");			
			FacesMessage faces = new FacesMessage(this.mensagem);
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, faces);		
			RequestContext.getCurrentInstance().update("'messages");
		}
		
	}

	public String deleteCondicaoPagamento() {
		CondicaoPagamentoSession condicaoPagamentoRN = new CondicaoPagamentoSession();		
		CondicaoPagamento condicaoPagamento = this.condicaoPagamentoSave;
		this.mensagem = condicaoPagamentoRN.delete(condicaoPagamento);
		System.out.println(this.mensagem);
		this.condicaoPagamentoSave = new CondicaoPagamento();
		RequestContext.getCurrentInstance().update(":formConsultarCondicaoPagamento:dataTableCondicaoPagamento");
		FacesMessage faces = new FacesMessage(mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);
		return "consultarCondicaoPagamento";
	}
	
	public DataModel findCondicaoPagamento() {
		RequestContext.getCurrentInstance().update("panelDialogConsultarCondicaoPagamento");		
		
		List<CondicaoPagamento> listaCondicaoPagamento = new CondicaoPagamentoSession().find(this.condicaoPagamento);
		this.dmCondicaoPagamento = new ListDataModel(listaCondicaoPagamento);
		return this.dmCondicaoPagamento;
	}
	
	//PARCELA
	public void addParcela() {
		
		if(this.listaParcela.size() == 0) {
			this.parcela.setNumero(1);
		} else {
			this.parcela.setNumero(this.listaParcela.size() +1);
		}
		this.parcela.setCondicaoPagamento(this.condicaoPagamentoSave);
		
		CondicaoPagamentoSession session = new CondicaoPagamentoSession();
		String mensagem = session.addParcela(this.parcela, this.listaParcela, this.totalParcela);
		if(!(mensagem.equals(""))) {
			FacesMessage faces = new FacesMessage(mensagem);
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, faces);
			RequestContext.getCurrentInstance().update("pgCondicaoPagamento");
			RequestContext.getCurrentInstance().update("pgFormaPgto");
			RequestContext.getCurrentInstance().update("pgJuros");
			RequestContext.getCurrentInstance().update("pgParcela");
			
		} else {
			this.listaParcela.add(this.parcela);
			this.totalParcela = this.totalParcela + this.parcela.getPercentual();
			RequestContext.getCurrentInstance().update("tableParcela");
			this.parcela = new Parcela();			
			RequestContext.getCurrentInstance().update("pgParcela");
		}
	}
	
	public void removeParcela() {

		System.out.println(this.parcelaSelect.getDias());
		this.listaParcela.remove(this.parcelaSelect);
		for (Parcela parcela : this.listaParcela) {
			parcela.setNumero(this.listaParcela.size() + 1 - this.listaParcela.size());
			this.listaParcela.add(parcela);
		}
		this.totalParcela = this.totalParcela - this.parcelaSelect.getPercentual();
		RequestContext.getCurrentInstance().update("tableParcela");
		this.parcela = new Parcela();			
		RequestContext.getCurrentInstance().update("pgParcela");
		
	}
	//INVOCAR TELAS
	public String newCondicaoPagamento() {
		this.condicaoPagamentoSave = new CondicaoPagamento();
		this.condicaoPagamentoSave.setFormaPagamento(new FormaPagamento());
		this.listaParcela = new ArrayList<Parcela>();
		this.parcela = new Parcela();
		this.totalParcela = 0.00;
		this.parcelaSelect = new Parcela();
		return "manterCondicaoPagamento";
	}
	
	public String consultarCondicaoPagamento() {
		this.condicaoPagamento = new CondicaoPagamento();
		this.condicaoPagamento.setFormaPagamento(new FormaPagamento());
		return "consultarCondicaoPagamento";
	}


	public String editarCondicaoPagamento() {
		this.condicaoPagamentoSave = (CondicaoPagamento) this.dmCondicaoPagamento.getRowData();
		Parcela parcela = new Parcela();
		ParcelaSession session = new ParcelaSession();
		parcela.setCondicaoPagamento(this.condicaoPagamentoSave);
		List<Parcela> lista = session.find(parcela);
		this.listaParcela = lista;
		return "editarCondicaoPagamento";
	}
	
	public String excluirCondicaoPagamento() {
		this.condicaoPagamentoSave = (CondicaoPagamento) this.dmCondicaoPagamento.getRowData();
		return "excluirCondicaoPagamento";
	}
	
	
	public void clean() {
		this.condicaoPagamento = new CondicaoPagamento();
		this.listaParcela = new ArrayList<Parcela>();
		RequestContext.getCurrentInstance().update("tableParcela");
	}


	//DIALOGS
	public void openDialogConsultarFormaPagamento() {
		RequestContext.getCurrentInstance().update("idDialogConsultarFormaPagamento");
		RequestContext.getCurrentInstance().execute("dialogConsultarFormaPagamento.show()");
	}
	
	public void openDialogManterFormaPagamento() {
		this.condicaoPagamentoSave = new CondicaoPagamento();
		RequestContext.getCurrentInstance().update("idDialogManterFormaPagamento");
		RequestContext.getCurrentInstance().execute("dialogManterFormaPagamento.show()");
	}
	
	//DIALOG FORMA DE PAGAMENTO
	
	public void saveFormaPagamento() {
		FormaPagamentoSession formaPagamentoSession = new FormaPagamentoSession();
		FormaPagamento formaPagamento = this.formaPagamento;		
		this.mensagem = formaPagamentoSession.save(formaPagamento);
		
		FacesMessage faces = new FacesMessage(this.mensagem);
		FacesContext contexto = FacesContext.getCurrentInstance();
		contexto.addMessage(null, faces);		
	}

	public DataModel findFormaPagamento() {
		List<FormaPagamento> listaFormaPagamento = new FormaPagamentoSession().find(this.formaPagamento);
		this.dmFormaPagamento = new ListDataModel(listaFormaPagamento);
		return this.dmFormaPagamento;
	}
	
	public void selectFormaPagamento() {
		FormaPagamento formaPagamentoAux = (FormaPagamento) this.dmFormaPagamento.getRowData();
		this.condicaoPagamentoSave.setFormaPagamento(formaPagamentoAux);
		RequestContext.getCurrentInstance().update("pgFormaPgto");
		RequestContext.getCurrentInstance().execute("dialogConsultarFormaPagamento.hide()");
	}
	
	//FIM DIALOG FORMA PAGAMENTO
}
